﻿using System;
using System.Drawing;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TextBox;

namespace sy4_4
{
    public partial class Form1 : Form
    {
        // 存储当前字体样式（避免重复创建Font对象，提升效率）
        private FontStyle _currentFontStyle = FontStyle.Regular;

        public Form1()
        {
            InitializeComponent();
            // 绑定独立事件（每个控件只响应自身功能，不共享事件）
            txtParam.Leave += TxtParam_Leave; // 参数验证（失去焦点触发）
            rbSin.CheckedChanged += RadioButton_CheckedChanged; // 函数选择
            rbCos.CheckedChanged += RadioButton_CheckedChanged;
            rbTan.CheckedChanged += RadioButton_CheckedChanged;
            cbBold.CheckedChanged += CbBold_CheckedChanged; // 粗体设置
            cbItalic.CheckedChanged += CbItalic_CheckedChanged; // 斜体设置
            cbRed.CheckedChanged += CbRed_CheckedChanged; // 颜色设置
        }

        /// <summary>
        /// 窗体加载事件：初始化参数和默认结果
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            txtParam.Text = "3.14159";
            // 初始计算一次默认参数的结果
            CalculateTrigonometric();
        }

        /// <summary>
        /// 参数文本框Leave事件：验证参数合法性（实验核心要求）
        /// </summary>
        private void TxtParam_Leave(object sender, EventArgs e)
        {
            try
            {
                // 尝试转换为double，非数字则触发catch
                double.Parse(txtParam.Text.Trim());
                // 参数合法则重新计算结果
                CalculateTrigonometric();
            }
            catch
            {
                MessageBox.Show("参数必须是数字！", "输入错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtParam.Focus();
                txtParam.SelectAll();
            }
        }

        /// <summary>
        /// 单选按钮事件：仅执行三角函数计算（拆分功能，提升效率）
        /// </summary>
        private void RadioButton_CheckedChanged(object sender, EventArgs e)
        {
            // 仅当单选按钮被选中时才计算（避免重复触发）
            if (sender is RadioButton radio && radio.Checked)
            {
                CalculateTrigonometric();
            }
        }

        /// <summary>
        /// 粗体复选框事件：仅设置粗体样式（用异或运算符切换，实验提示要求）
        /// </summary>
        private void CbBold_CheckedChanged(object sender, EventArgs e)
        {
            _currentFontStyle ^= FontStyle.Bold; // 异或运算：选中则添加，取消则移除
            UpdateResultFont();
        }

        /// <summary>
        /// 斜体复选框事件：仅设置斜体样式（用异或运算符切换）
        /// </summary>
        private void CbItalic_CheckedChanged(object sender, EventArgs e)
        {
            _currentFontStyle ^= FontStyle.Italic;
            UpdateResultFont();
        }

        /// <summary>
        /// 红色复选框事件：仅设置字体颜色
        /// </summary>
        private void CbRed_CheckedChanged(object sender, EventArgs e)
        {
            txtResult.ForeColor = cbRed.Checked ? Color.Red : Color.Black;
        }

        /// <summary>
        /// 私有方法：三角函数计算（独立封装，复用性更强）
        /// </summary>
        private void CalculateTrigonometric()
        {
            try
            {
                double x = double.Parse(txtParam.Text.Trim());
                double y = 0;

                // 根据选中的函数计算结果
                if (rbSin.Checked)
                    y = Math.Sin(x);
                else if (rbCos.Checked)
                    y = Math.Cos(x);
                else if (rbTan.Checked)
                    y = Math.Tan(x);

                // 结果保留2位小数（实验核心要求）
                txtResult.Text = Math.Round(y, 2).ToString();
            }
            catch
            {
                // 异常已在Leave事件中处理，此处仅容错
                txtResult.Text = "参数错误";
            }
        }

        /// <summary>
        /// 私有方法：更新结果文本字体样式（独立封装，避免重复代码）
        /// </summary>
        private void UpdateResultFont()
        {
            txtResult.Font = new Font(txtResult.Font.Name, txtResult.Font.Size, _currentFontStyle);
        }
    }
}